// 导出一个axios的实例  而且这个实例要有请求拦截器 响应拦截器
import axios from 'axios'
import store from '@/store/index'
// 引入路由
// import router from '@/router'
// const service = axios.create() // 创建一个axios的实例
const service = axios.create({
  // baseURL: 'http://ihrm-java.itheima.net', // 设置axios请求的基础的基础地址
  timeout: 5000, // 定义5秒超时
  baseURL: process.env.VUE_APP_BASE_API // 动态拿到基地址: 自动收集所有的环境变量,然后在不同生产环境和开发环境去选择基地址,根据npm run dev / npm run build
})
// 请求拦截器 :加(注入token)
service.interceptors.request.use(
  config => {
    console.log('store', store)
    // 如何在.js中获取token?:  import store from '@/store/index'
    // if(如果有token) {就带上请求头}
    const token = store.state.token
    // 如果当前存有token,就加在请求头上
    if (token) {
      // 设置请求头(必须看接口文档)
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  }

  , error => {
    return Promise.reject(error)
  })
// 响应拦截器中
// 两个参数: 第一个参数处理成功,第二个参数处理错误
// 在axios内部,当状态码>400,就进入第二个参数:报错
// 1. 根据后端返回的数据判断本次操作是否成功,不成功 主动报错
// 2.如果成功,只返回有效数据
service.interceptors.response.use(
  response => {
    if (response.data.success) {
      return response.data // 1. 把返回数据外面包裹的data去掉了 就不用每次写res.data.data这些这样麻烦了
    } else {
      // 如果success为false 业务出错,直接触发reject
      // 2. 被catch分支捕获 (是login.vue的doLogin发请求里面的try,catch)
      return Promise.reject(new Error(response.data.message))
    }
  },
  async error => {
    console.log('请求出错了', error)
    // if (error.response.data.code === 10002) {
    //   console.log('token失效')
    //   // token过期
    //   // 1. 清空token
    //   await store.dispatch('user/logout')
    //   // 2. 跳转到登录页
    //   // router.currentRoute   [.js]  <====>  this.$route[.vue]
    //   router.push('/login?return_url=' + router.currentRoute.fullPath)
    // }
    // console.dir(error)
    return Promise.reject(error)
  }
)
export default service // 导出axios实例
